'use strict'
process.chdir(__dirname);
const titbit=require('titbit')
const fs= require('fs')
const pg=require('pg')
const dbconfig=require('./dbconfig')
//使用HTTP/1.1的页面
const httpcli=require('gohttp');
const wxkey = require('./wxkey');
const token=require('titbit-token')
let tok=new token({
    //token有效期，单位是秒
    expires:30,
    //必须是32位数子字母
    key:'qwertyuiopasdfghjklzxcvbnm123456',
    //必须是16位数字字母
    iv:'1234567890qwerty'
})

//初始化数据库链接
let  psql=new pg.Pool(dbconfig)
try{
    fs.accessSync('./images')
} catch(err){
    fs.mkdirSync('./images')
}
let cert_path='/usr/local/share'
const app=new titbit({
    //开启调试模式，会输出错误信息
    debug:true,
    globallog:true,
    cert:`${cert_path}/aaa.coralmh.xyz.pem`,
    key:`${cert_path}/aaa.coralmh.xyz.key`
})
/**-----------------content路由------------------ */
app.get('/content',async c=>{
    let sqltext=`SELECT id,title,update_time FROM content`
    let r=await psql.query(sqltext)
    c.send(r.rows)
})
app.post('/content',async c=>{
    try{
        //c.body 是提交的请求体数据
        let data=JSON.parse(c.body)
        let sqltext= `INSERT INTO content`
        +`(id,detail,title,add_time,update_time)`
        +'VALUES($1,$2,$3,$4,$5)'
        //随机数转成16进制字符串并去掉前两位，字符串作为ID
        let id=Math.random().toString(16).substring(2)
        let tm=Date.now()
        
        let r=await psql.query(sqltext,[id,data.detail,data.title,tm, tm])
        if(r.rowCount===0){
            return c.status(500).send('failed')
        }
        c.send(id)
    }catch(err){
        console.error(err)
        c.status(400).send('bad data')
    }
})
app.get('/content/:id',async c=>{
    let id=c.param.id
    let sqltext='SELECT id,detail,title,update_time'+'FROM content WHERE id=$1';
    let r=await psql.query(sqltext,[id])
    if(r.rowCount===0){
        return c.status(404).send('not found')
     c.send(r.rows[0])
    }

})
app.delete('/content/:id',async c=>{
    let r=await psql.query(`DELETE FROM content WHERE id=$1`,
    [c.param.id])
    c.send({
        count:r.rowCount
    })
})

/**-----------------content路由------------------ */
//c 就是context
app.get('/',async c=>{
    c.send('ok')
})
app.get('/upload',async c=>{
    //c.helper是助手函数模块，其中有对stream.pipe的封装
    //c.reply是响应对象，http/1.1中指向response,http/2中指向stream。
await c.helper.pipe('./upload.html',c.reply)
})
//js无需加分号，谁用谁知道
//有时也得加分号，括号开头很需要
app.post('/upload',async c=>{
    let f=c.getFile('file')
    if(!f){
        return c.status(400),send('file not found')
    }
    //生成唯一文件名
    let fname=c.helper.makeName(f.filename)
    try{
      await c.moveFile(f,`./images/${fname}`)
      c.send(fname)
    } catch(err){
        c.status(500).send('failed')
    }
})

//:开头表示这个路由是带参数的路由
app.get('/images/:name',async c=>{
    let imgname=c.param.name;
    try{
        await c.helper.pipe(`./images/${imgname}`,c.reply)
    }catch(err){
        c.status(404).send('images not found')
    }

})
app.get('/user/:name/:age/:mobile',async c=>{
    console.log(c.param)
    c.send(c.param)
})
app.get('/mp-login/:code',async c=>{
    c.send(c.param)
    let auth_url=`https://api/weixin/.qq.com/sns/jscode2session`
                 +`?appid=${wxkey.appid}`
                 +`&secret=${wx.key.secret}`
                 +`&js_code=${c.param.code}`
    let ret=await httpcli.get(auth_url)
                         .then(res=>{
                             res.json
                            }
                         )

})

app.run(2001)